#include "sql_lite3.h"
/*
CREATE TABLE log_in (
    id INT PRIMARY KEY,   -- 定义 id 为主键，自动唯一
    User CHAR(50),            -- 字符类型，固定长度为 50 个字符
    password CHAR(50)         -- 字符类型，固定长度为 50 个字符
);
*/

// 初始化数据库
sqlite3 * sqlite3_init(void)
{
    char sql_cmd[1024];
    int sql_err;
    sqlite3 * hqyj;
    
    // 创建表

    // 打开数据库
    sql_err = sqlite3_open( "HQYJ.db" , &hqyj );
    if(sql_err != SQLITE_OK )
    {
        printf("错误信息:%s\n" , sqlite3_errmsg(hqyj) );
        return NULL;
    }

    // 构建建表语句
    // IF NOT EXISTS  有表格时 不报错
    // INTEGER PRIMARY KEY AUTOINCREMENT  唯一主键  自动自增
    strcpy(sql_cmd , "CREATE TABLE IF NOT EXISTS log_in  (id INTEGER PRIMARY KEY AUTOINCREMENT , User CHAR(50), password CHAR(50) ) ");

    sql_err = sqlite3_exec(hqyj , sql_cmd , NULL , NULL , NULL);
    if(sql_err != SQLITE_OK )
    {
        printf("错误信息:%s\n" , sqlite3_errmsg(hqyj) );
        return NULL;
    }
    return hqyj;
}


// 插入
void Insert_INTO_log_in(sqlite3 *sql)
{
    // sql 语句
    char sql_cmd[1024];
    // sql 报错代码
    int sql_err;

    // 写入信息
    char name[50];
    char password[50];

    // 报错信息
    char * str_err;

    // 用户输入信息
    printf("请输入账号:");
    scanf("%49s" , name);
    printf("请输入密码:");
    scanf("%49s" , password);

    // 组装命令
    sprintf( sql_cmd , "INSERT INTO log_in (User , password) VALUES ('%s' , '%s')" , name , password );
    
    // 写入命令
    sqlite3_exec(sql , sql_cmd , NULL , NULL  , &str_err);
    if(SQLITE_OK != sql_err)
    {
        printf("插入错误:%s\n" , str_err);
        sqlite3_free(str_err);
    }
    printf("插入成功\n");
    return ;
}

// 删除
void Delete_FROM_log_in(sqlite3 *sql)
{
    // sql 语句
    char sql_cmd[1024];
    // sql 报错代码
    int sql_err;

    // 写入信息
    int id = 0;

    // 报错信息
    char * str_err;

    // 用户输入信息
    printf("请输入id:");
    scanf("%d" , &id);

    // 组装命令
    sprintf( sql_cmd , "DELETE FROM log_in WHERE id = %d" , id );
    
    // 写入命令
    sqlite3_exec(sql , sql_cmd , NULL , NULL  , &str_err);
    if(SQLITE_OK != sql_err)
    {
        printf("删除错误:%s\n" , str_err);
        sqlite3_free(str_err);
    }
    printf("删除成功\n");
    return ;
}


// 查找
void Select_FROM_log_in(sqlite3 *sql)
{
    // sql 语句
    char sql_cmd[1024];
    // sql 报错代码
    int sql_err;

    // 写入信息
    int id = 0;

    // 报错信息
    char * str_err;

    // 用户输入信息
    printf("请输入id:");
    scanf("%d" , &id);

    // 组装命令
    sprintf( sql_cmd , "SELECT * FROM log_in WHERE id = %d" , id );
    
    // 写入命令
    sqlite3_exec(sql , sql_cmd , callback , NULL  , &str_err);
    if(SQLITE_OK != sql_err)
    {
        printf("查询错误:%s\n" , str_err);
        sqlite3_free(str_err);
    }
    printf("查询成功\n");
    return ;
}


// 修改
void Updata_SET_log_in(sqlite3 *sql)
{
    // sql 语句
    char sql_cmd[1024];
    // sql 报错代码
    int sql_err;

    // 写入信息
    int id = 0;
    char name[50];
    char password[50];


    // 报错信息
    char * str_err;

    // 用户输入信息
    printf("请输入id:");
    scanf("%d" , &id);

    // 用户输入信息
    printf("请输入账号:");
    scanf("%49s" , name);
    printf("请输入密码:");
    scanf("%49s" , password);

    // 组装命令
    sprintf( sql_cmd , "UPDATE log_in SET User = '%s' , password = '%s' WHERE id = %d" , name , password ,  id );
    
    // 写入命令
    sqlite3_exec(sql , sql_cmd , callback , NULL  , &str_err);
    if(SQLITE_OK != sql_err)
    {
        printf("更新错误:%s\n" , str_err);
        sqlite3_free(str_err);
    }
    printf("更新成功\n");
    return ;
}

// 回调函数
int callback(void *data, int argc, char **argv, char **azColName)
{
    for (size_t i = 0; i < argc; i++)
    {
        printf("%s : %s \n" , azColName[i] , argv[i] ? argv[i] : "NULL" );
    }
}


// typedef int (*sqlite3_callback)(
//     void*,    /* 在 sqlite3_exec() 的第 4 个参数中提供的数据 */
//     int,      /* 查询到几个数据 */
//     char**,   /* 表示行中字段的字符串数组 */
//     char**    /* 表示列名的字符串数组 */
// );